/*
 *  tracker/ToolInvokeHelper.cpp
 *
 *  Copyright 2009 Peter Barth
 *
 *  This file is part of Milkytracker.
 *
 *  Milkytracker is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  Milkytracker is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with Milkytracker.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

/*
 *  ToolInvokeHelper.cpp
 *  MilkyTracker
 *
 *  Created by Peter Barth on 14.11.05.
 *
 */

#include "ToolInvokeHelper.h"
#include "Tracker.h"
#include "ListBox.h"
#include "PatternEditorControl.h"
#include "DialogWithValues.h"
#include "DialogQuickChooseInstrument.h"
#include "Screen.h"

ToolInvokeHelper::ToolInvokeHelper (Tracker& theTracker) :
    tracker(theTracker),
    dialog(NULL)
{
    resetLastValues();
}

ToolInvokeHelper::~ToolInvokeHelper ()
{
    delete dialog;
}

void ToolInvokeHelper::resetLastValues()
{
    lastValues.volumeScaleStart = lastValues.volumeScaleEnd = -1.0f;
}


bool ToolInvokeHelper::invokeTool(ToolTypes toolType, pp_int16 keyDownKeyCode /* = -1*/)
{
    if (tracker.screen->getModalControl())
        return false;

    lastToolType = toolType;

    if (dialog)
    {
        delete dialog;
        dialog = NULL;
    }

    switch (toolType)
    {
        case ToolTypePatternVolumeScale:
            dialog = new DialogWithValues(tracker.screen, this, PP_DEFAULT_ID, "Volume scale pattern" PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues);
            break;

        case ToolTypeTrackVolumeScale:
            dialog = new DialogWithValues(tracker.screen, this, PP_DEFAULT_ID, "Volume scale track" PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues);
            break;

        case ToolTypeSelectionVolumeScale:
            dialog = new DialogWithValues(tracker.screen, this, PP_DEFAULT_ID, "Volume scale block" PPSTR_PERIODS, DialogWithValues::ValueStyleEnterTwoValues);
            break;

        case ToolTypeQuickChooseInstrument:
        {
            dialog = new DialogQuickChooseInstrument(tracker.screen, this, PP_DEFAULT_ID, "Choose instrument" PPSTR_PERIODS);
            static_cast<DialogQuickChooseInstrument*>(dialog)->setValueCaption("Enter hex value:");
            pp_uint16 value = static_cast<DialogQuickChooseInstrument*>(dialog)->numPadKeyToValue(keyDownKeyCode);
            static_cast<DialogQuickChooseInstrument*>(dialog)->setValue(value);
            dialog->setKeyDownInvokeKeyCode(keyDownKeyCode);
            dialog->show();
            return true;
            break;
        }

        default:
            return false;
    }

    static_cast<DialogWithValues*>(dialog)->setValueOneCaption("Enter start scale:");
    static_cast<DialogWithValues*>(dialog)->setValueTwoCaption("Enter end scale:");
    static_cast<DialogWithValues*>(dialog)->setValueOneRange(0, 100.0f, 2);
    static_cast<DialogWithValues*>(dialog)->setValueTwoRange(0, 100.0f, 2);
    static_cast<DialogWithValues*>(dialog)->setValueOneIncreaseStep(0.01f);
    static_cast<DialogWithValues*>(dialog)->setValueTwoIncreaseStep(0.01f);
    static_cast<DialogWithValues*>(dialog)->setValueOne(lastValues.volumeScaleStart != -1.0f ? lastValues.volumeScaleStart : 1.0f);
    static_cast<DialogWithValues*>(dialog)->setValueTwo(lastValues.volumeScaleEnd != -1.0f ? lastValues.volumeScaleEnd : 1.0f);

    dialog->setKeyDownInvokeKeyCode(keyDownKeyCode);

    dialog->show();

    return true;
}

pp_int32 ToolInvokeHelper::ActionOkay(PPObject* sender)
{
    switch (lastToolType)
    {
        case ToolTypePatternVolumeScale:
            lastValues.volumeScaleStart = static_cast<DialogWithValues*>(dialog)->getValueOne();
            lastValues.volumeScaleEnd = static_cast<DialogWithValues*>(dialog)->getValueTwo();
            tracker.getPatternEditor()->scaleVolumePattern(lastValues.volumeScaleStart, lastValues.volumeScaleEnd);
            break;

        case ToolTypeTrackVolumeScale:
            lastValues.volumeScaleStart = static_cast<DialogWithValues*>(dialog)->getValueOne();
            lastValues.volumeScaleEnd = static_cast<DialogWithValues*>(dialog)->getValueTwo();
            tracker.getPatternEditor()->scaleVolumeTrack(lastValues.volumeScaleStart, lastValues.volumeScaleEnd);
            break;

        case ToolTypeSelectionVolumeScale:
            lastValues.volumeScaleStart = static_cast<DialogWithValues*>(dialog)->getValueOne();
            lastValues.volumeScaleEnd = static_cast<DialogWithValues*>(dialog)->getValueTwo();
            tracker.getPatternEditor()->scaleVolumeSelection(lastValues.volumeScaleStart, lastValues.volumeScaleEnd);
            break;

        case ToolTypeQuickChooseInstrument:
        {
            pp_int32 value = static_cast<DialogQuickChooseInstrument*>(dialog)->getValue();
            if (value == 0)
                tracker.enableInstrument(false);
            else
            {
                tracker.enableInstrument(true);
                // set listbox index before calling Tracker::selectInstrument()
                tracker.listBoxInstruments->setSelectedIndex(value - 1, false);
                tracker.selectInstrument(value);
            }
        }
    }

    return 0;
}

pp_int32 ToolInvokeHelper::ActionCancel(PPObject* sender)
{
    return 0;
}